home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / network / base / net-tool.32- / net-tool / net-tools-1.32-alpha / hostname.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-02-18  |  9.9 KB  |  361 lines

  1. /*
  2.  * hostname    This file contains an implementation of the command
  3.  *        that maintains the hostname and the domainname. It
  4.  *        is also used to show the FQDN and the IP-Addresses.
  5.  *
  6.  * Usage:    hostname [-d|-f|-s|-a|-i|-y]
  7.  *        hostname [-h|-V]
  8.  *        hostname {name|-F file}
  9.  *        dnsdmoainname    
  10.  *        nisdomainname {name|-F file}
  11.  *
  12.  * Version:    hostname 1.96 (1996-02-18)
  13.  *
  14.  * Author:    Peter Tobias <tobias@et-inf.fho-emden.de>
  15.  *
  16.  * Changes:
  17.  *      {1.90}    Peter Tobias :        Added -a and -i options.
  18.  *     {1.91}    Bernd Eckenfels :    -v,-V rewritten, long_opts 
  19.  *                    (major rewrite), usage.
  20.  *960120 {1.95}    Bernd Eckenfels :    -y/nisdomainname - support for get/
  21.  *                    setdomainname added 
  22.  *960218 {1.96} Bernd Eckenfels :    netinet/in.h added
  23.  *
  24.  *        This program is free software; you can redistribute it
  25.  *        and/or  modify it under  the terms of  the GNU General
  26.  *        Public  License as  published  by  the  Free  Software
  27.  *        Foundation;  either  version 2 of the License, or  (at
  28.  *        your option) any later version.
  29.  */
  30. #include <stdio.h>
  31. #include <unistd.h>
  32. #include <getopt.h>
  33. #include <string.h>
  34. #include <netdb.h>
  35. #include <errno.h>
  36. #include <sys/param.h>
  37. #include <netinet/in.h>
  38. #include <arpa/inet.h>
  39. #include "config.h"
  40. #include "version.h"
  41. #include "net-locale.h"
  42.  
  43. char *Release = RELEASE,
  44.      *Version = "hostname 1.96 (1996-02-18)";
  45.      
  46. static char *program_name;
  47. static int  opt_v;
  48.  
  49. static void sethname(char *);
  50. static void setdname(char *);
  51. static void showhname(char *, int);
  52. static void usage(void);
  53. static void version(void);
  54. static void setfilename(char *,int);
  55.  
  56. #define SETHOST        1
  57. #define SETDOMAIN    2
  58.  
  59. static void sethname(char *hname)
  60. {
  61.     if (opt_v)
  62.         fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_verb_set, "Setting hostname to `%s'\n"),
  63.             hname);
  64.     if(sethostname(hname, strlen(hname))) {
  65.         switch(errno) {
  66.             case EPERM:
  67.                 fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_root,
  68.                                "%s: you must be root to change the host name\n"), program_name);
  69.                 break;
  70.             case EINVAL:
  71.                 fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_toolong,
  72.                                "%s: name too long\n"), program_name);
  73.                 break;
  74.             default:
  75.         }
  76.         NLS_CATCLOSE(catfd)
  77.         exit(1);
  78.     };
  79. }
  80.  
  81. static void setdname(char *dname)
  82. {
  83.     if (opt_v)
  84.         fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_verb_dset, "Setting domainname to `%s'\n"),
  85.             dname);
  86.     if(setdomainname(dname, strlen(dname))) {
  87.         switch(errno) {
  88.             case EPERM:
  89.                 fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_dname_root,
  90.                                "%s: you must be root to change the domain name\n"), program_name);
  91.                 break;
  92.             case EINVAL:
  93.                 fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_dname_toolong,
  94.                                "%s: name too long\n"), program_name);
  95.                 break;
  96.             default:
  97.         }
  98.         NLS_CATCLOSE(catfd)
  99.         exit(1);
  100.     };
  101. }
  102.  
  103. static void showhname(char *hname, int c)
  104. {
  105.     struct hostent *hp;
  106.     register char *p,**alias;
  107.     struct in_addr **ip;
  108.     
  109.     if (opt_v)
  110.         fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_verb_res, "Resolving `%s' ...\n"),hname);
  111.     if (!(hp = gethostbyname(hname))) {
  112.         herror(program_name);
  113.         NLS_CATCLOSE(catfd)
  114.         exit(1);
  115.     }
  116.  
  117.     if (opt_v) { 
  118.         fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_verb_fnd, "Result: h_name=`%s'\n"),
  119.             hp->h_name);
  120.             
  121.         alias=hp->h_aliases;
  122.         while(alias[0])
  123.             fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_verb_ali, "Result: h_aliases=`%s'\n"),
  124.                 *alias++);
  125.                 
  126.         ip=(struct in_addr **)hp->h_addr_list;
  127.         while(ip[0])
  128.             fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_verb_ipn, "Result: h_addr_list=`%s'\n"),
  129.                 inet_ntoa(**ip++));
  130.     }
  131.  
  132.     if (!(p = strchr(hp->h_name, '.')) && (c == 'd')) return;
  133.  
  134.     switch(c) {
  135.         case 'a':
  136.             while (hp->h_aliases[0])
  137.                 printf("%s ", *hp->h_aliases++);
  138.             printf("\n");
  139.             break;
  140.         case 'i':
  141.             while (hp->h_addr_list[0])
  142.                 printf("%s ", inet_ntoa(*(struct in_addr *) * hp->h_addr_list++));
  143.             printf("\n");
  144.             break;
  145.         case 'd':
  146.             printf("%s\n", ++p);
  147.             break;
  148.         case 'f':
  149.             printf("%s\n", hp->h_name);
  150.             break;
  151.         case 's':
  152.             if (p != NULL) *p = '\0';
  153.             printf("%s\n", hp->h_name);
  154.             break;
  155.         default:
  156.     }
  157. }
  158.  
  159. static void setfilename(char * name,int what)
  160. {        
  161.   register FILE *fd;
  162.   register char *p;
  163.   char fline[MAXHOSTNAMELEN];
  164.  
  165.   if ((fd = fopen(name, "r")) != NULL) {
  166.     while (fgets(fline, sizeof(fline), fd) != NULL) {
  167.         if ((p = index(fline, '\n')) != NULL)
  168.             *p = '\0';
  169.             if (opt_v) fprintf(stderr, ">> %s\n", fline);
  170.             if (fline[0] == '#')
  171.                 continue;
  172.             if (what == SETHOST) {
  173.                 sethname(fline);
  174.             } else {
  175.                 setdname(fline);
  176.             }
  177.     }
  178.     (void) fclose(fd);
  179.   } else {
  180.     fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_cant_open, "%s: can't open `%s'\n"),
  181.             program_name, optarg);
  182.     NLS_CATCLOSE(catfd)
  183.     exit(1);
  184.   }
  185. }
  186.  
  187. static void version(void)
  188. {
  189.     fprintf(stderr,"%s\n%s\n",Release,Version);
  190.     NLS_CATCLOSE(catfd)
  191.     exit(-1);
  192. }
  193.  
  194. static void usage(void)
  195. {
  196.     fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage1, 
  197.         "Usage: hostname [-v] {hostname|-F file}      set hostname (from file)\n"));
  198.     fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage2, 
  199.         "       domainname [-v] {nisdomain|-F file}   set NIS domainname (from file)\n"));
  200.     fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage3, 
  201.         "       hostname [-v] [-d|-f|-s|-a|-i|-y]     display formated name\n"));
  202.     fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage4, 
  203.         "       hostname [-v]                         display hostname\n\n"));
  204.     fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage5, 
  205.         "       hostname -V|--version|-h|--help       print info and exit\n\n"));
  206.     fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage6, 
  207.         "    dnsdomainname=hostname -d, {yp,nis,}domainname=hostname -y\n\n"));
  208.     fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage7, 
  209.         "    -s, --short           short host name\n"));
  210.     fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage8, 
  211.         "    -a, --alias           alias names\n"));
  212.     fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage9, 
  213.         "    -i, --ip-address      addresses for the hostname\n"));
  214.     fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage10, 
  215.         "    -f, --fqdn, --long    long host name (FQDN)\n"));
  216.     fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage11, 
  217.         "    -d, --domain          DNS domain name\n"));
  218.     fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage12, 
  219.         "    -y, --yp, --nis       NIS/YP domainname\n"));
  220.     fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage13, 
  221.         "    -F, --file            read hostname or nis domainname from given File\n\n"));
  222.     fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage14, 
  223.         "   This comand can get or set the hostname or the NIS domainname. You can\n"));
  224.     fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage15, 
  225.         "   also get the DNS domain or the FQDN (fully qualified domain name).\n"));
  226.     fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage16, 
  227.         "   Unless you are using bind or NIS for host lookups you can change the\n"));
  228.     fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage17, 
  229.         "   FQDN (Fully Qualified Domain Name) and the DNS domain name (which is\n"));
  230.     fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage18, 
  231.         "   part of the FQDN) in the /etc/hosts file.\n"));
  232.     NLS_CATCLOSE(catfd)
  233.     exit(-1);
  234. }
  235.  
  236.  
  237. int main(int argc, char **argv)
  238. {
  239.     int c;
  240.     char type='\0';
  241.     int option_index = 0;
  242.     int what = 0;
  243.     char myname[MAXHOSTNAMELEN+1];
  244.     char *file=NULL;
  245.  
  246.     static const struct option long_options[] =
  247.     {
  248.         {"domain", no_argument, 0, 'd'},
  249.         {"file", required_argument, 0, 'F'},
  250.         {"fqdn", no_argument, 0, 'f'},
  251.         {"help", no_argument, 0, 'h'},
  252.         {"long", no_argument, 0, 'f'},
  253.         {"short", no_argument, 0, 's'},
  254.         {"version", no_argument, 0, 'V'},
  255.         {"verbose", no_argument, 0, 'v'},
  256.         {"alias", no_argument, 0, 'a'},
  257.         {"ip-address", no_argument, 0, 'i'},
  258.         {"nis", no_argument, 0, 'y'},
  259.         {"yp", no_argument, 0, 'y'},
  260.         {0, 0, 0, 0}
  261.     };
  262.  
  263. #if NLS
  264.     setlocale (LC_MESSAGES, "");
  265.     catfd = catopen ("nettools", MCLoadBySet);
  266. #endif
  267.  
  268.     program_name = (rindex(argv[0], '/')) ? rindex(argv[0], '/') + 1 : argv[0];
  269.  
  270.     if (!strcmp(program_name,"ypdomainname") || 
  271.         !strcmp(program_name,"domainname")   || 
  272.         !strcmp(program_name,"nisdomainname"))
  273.         what = 3;
  274.     if (!strcmp(program_name,"dnsdomainname"))
  275.         what = 2;
  276.     
  277.     while((c = getopt_long(argc, argv, "adfF:h?isVvy", long_options, &option_index)) != EOF)
  278.     switch(c)
  279.     {
  280.         case 'd':
  281.             what = 2;
  282.             break;
  283.         case 'a':
  284.         case 'f':
  285.         case 'i':
  286.         case 's':
  287.             what = 1;
  288.             type=c;
  289.             break;
  290.         case 'y':
  291.             what = 3;
  292.             break;
  293.         case 'F':
  294.             file=optarg;                        
  295.             break;
  296.         case 'v':
  297.             opt_v++;
  298.             break;
  299.         case 'V':
  300.             version();
  301.         case '?':
  302.         case 'h':
  303.         default:
  304.             usage();
  305.  
  306.     };
  307.  
  308.  
  309.     switch(what) {
  310.         case 2:
  311.             if (file || (optind < argc)) {
  312.                 fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_nodns1,
  313.                        "%s: You can't change the DNS domain name with this command\n"), program_name);
  314.                 fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_nodns2,
  315.                        "\nUnless you are using bind or NIS for host lookups you can change the DNS\n"));
  316.                 fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_nodns3,
  317.                        "domain name (which is part of the FQDN) in the /etc/hosts file.\n"));
  318.                 NLS_CATCLOSE(catfd)
  319.                 exit(1);
  320.             }
  321.             type='d';            
  322.             /* NOBREAK */
  323.         case 0:
  324.             if (file) {
  325.                 setfilename(file,SETHOST);
  326.                 break;
  327.             }
  328.             if (optind < argc) {
  329.                 sethname(argv[optind]);
  330.                 break;
  331.             }
  332.         case 1:
  333.             gethostname(myname, sizeof(myname));
  334.             if (opt_v)
  335.                 fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_verb_get, 
  336.                     "gethostname()=`%s'\n"),myname);
  337.             if (!type)
  338.                 printf("%s\n",myname);
  339.             else
  340.                 showhname(myname,type);
  341.             break;
  342.         case 3:
  343.             if (file) {
  344.                 setfilename(file,SETDOMAIN);
  345.                 break;
  346.             }
  347.             if (optind < argc) {
  348.                 setdname(argv[optind]);
  349.                 break;
  350.             }
  351.             getdomainname(myname,sizeof(myname));
  352.             if (opt_v)
  353.                 fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_verb_dget, 
  354.                     "getdomainname()=`%s'\n"),myname);
  355.             printf("%s\n",myname);
  356.             break;
  357.     }
  358.     NLS_CATCLOSE(catfd)
  359.     exit(0);
  360. }
  361.